package com.clarence.dada.core.aop;

import com.clarence.dada.core.base.Result;
import com.clarence.dada.core.exception.AuthException;
import com.clarence.dada.core.exception.BusException;
import com.clarence.dada.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局的的异常拦截器（拦截所有的控制器）（带有@RequestMapping注解的方法上都会拦截）
 *
 * @author GD
 * @since 2020-07-30 10:30
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

//
//    /**
//     * 参数校验错误
//     *
//     * @param e 缺少控制层请求参数异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:44
//     */
//    @ExceptionHandler(MissingServletRequestParameterException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(MissingServletRequestParameterException e) {
//        log.warn("缺少请求参数", e);
//        String message = String.format("缺少请求参数: %s", e.getParameterName());
//        return new BaseResult<>(400, message);
//    }
//
//    /**
//     * 参数校验错误
//     *
//     * @param e 方法参数类型不匹配异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:45
//     */
//    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(MethodArgumentTypeMismatchException e) {
//        log.warn("方法参数类型不匹配异常: ", e);
//        String message = String.format("方法参数类型不匹配: %s", e.getName());
//        return new BaseResult<>(400, message);
//    }
//
//    /**
//     * 参数校验错误
//     *
//     * @param e 方法参数无效异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:47
//     */
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(MethodArgumentNotValidException e) {
//        log.warn("方法参数无效异常: ", e);
//        BindingResult result = e.getBindingResult();
//        FieldError error = result.getFieldError();
//        String message = String.format("%s:%s", error.getField(), error.getDefaultMessage());
//        return new BaseResult<>(400, message);
//    }
//
//    /**
//     * 参数校验错误异常
//     *
//     * @param e 绑定异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:47
//     */
//    @ExceptionHandler(BindException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(BindException e) {
//        log.warn("绑定异常: ", e);
//        FieldError error = e.getFieldError();
//        String message = String.format("%s:%s", error.getField(), error.getDefaultMessage());
//        return new BaseResult<>(400, message);
//    }
//
//    /**
//     * 参数校验错误异常
//     *
//     * @param e 约束冲突异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:48
//     */
//    @ExceptionHandler(ConstraintViolationException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(ConstraintViolationException e) {
//        log.warn("约束冲突异常: ", e);
//        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
//        ConstraintViolation<?> violation = violations.iterator().next();
//        String path = ((PathImpl) violation.getPropertyPath()).getLeafNode().getName();
//        String message = String.format("%s:%s", path, violation.getMessage());
//        return new BaseResult<>(400, message);
//    }
//
//    /**
//     * 参数校验错误异常
//     *
//     * @param e Http消息不可读异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:48
//     */
//    @ExceptionHandler(HttpMessageNotReadableException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public BaseResult<Void> handleError(HttpMessageNotReadableException e) {
//        log.warn("Http消息不可读异常: ", e);
//        String message = String.format("Http消息不可读异常:%s", e.getMessage());
//        return new BaseResult<>(400, message);
//    }
//
    /**
     * 认证异常--认证失败（账号密码错误，账号被冻结，token过期等）
     *
     * @param e 身份验证异常
     * @return 统一返回码
     * @author GD
     * @since 2020-08-06 9:49
     */
    @ExceptionHandler(AuthException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    public Result<Void> unAuth(AuthException e) {
//        LogManager.me().executeLog(LogTaskFactory.loginLog(username, e.getMessage()));
        return new Result<>(e.getErrorEnum());
    }
//
//    /**
//     * 认证异常--没有访问权限
//     *
//     * @param e 认证异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:49
//     */
//    @ExceptionHandler(PermissionException.class)
//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
//    @ResponseBody
//    public BaseResult<Void> permissionExpection(PermissionException e) {
//        return new BaseResult<>(ErrorEnum.NO_POWER_TO_RESOURCES);
//    }
//

    /**
     * 拦截业务异常
     *
     * @param e 业务异常
     * @return 统一返回码
     * @author GD
     * @since 2020-08-06 9:50
     */
    @ExceptionHandler(BusException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public Result<Void> bussiness(ServiceException e) {
        log.error("业务异常:", e);
//        if (LoginContextHolder.getContext().hasLogin()) {
//            LogManager.me().executeLog(LogTaskFactory.exceptionLog(LoginContextHolder.getContext().getUserId(), e));
//        }
//        HttpServletUtil.getRequest().setAttribute("tip", e.getMessage());
        return new Result<>(e.getErrorEnum());
    }
//
//    /**
//     * 拦截未知的运行时异常
//     *
//     * @param e 运行时异常
//     * @return 统一返回码
//     * @author GD
//     * @since 2020-08-06 9:51
//     */
//    @ExceptionHandler(Throwable.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ResponseBody
//    public BaseResult<Void> notFount(Throwable e) {
//        log.error("运行时异常:", e);
//        if (LoginContextHolder.getContext().hasLogin()) {
//            LogManager.me().executeLog(LogTaskFactory.exceptionLog(LoginContextHolder.getContext().getUserId(), e));
//        }
//        String message = String.format("服务器未知运行时异常: %s", e.getMessage());
//        getRequest().setAttribute("tip", message);
//        return new BaseResult<>(500, e.getMessage());
//    }


    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public Result<Void> handleError(Exception e) {
        log.warn("未知异常", e);
        String message = String.format("未知异常: %s", e.getMessage());
        return new Result<>("400", message);
    }

}
